package com.patterns.decorator;

/**
 * @Author Tanyu
 * @Date 2020/6/2 11:03
 * @Description 动态地给一个对象增加新的功能。装饰模式是一种用于代替继承的方式，不需要再通过继承就能扩展对象的新功能。 举个例子：我想要一台智能、既上天又可以下水还能陆地跑的车。但是我现在只有一台普通的车，我就要给不同的厂家改装这台车，有智能公司、飞机公司等等。最后得到我想要的车
 * Component抽象：实现客户端跟实例对象的交互，如 io流中的InputStream、OutputStream接口 ConcreteComponent：真实对象，如
 * io流中的FileInputStream、FileOutputStream，例子中手上的普通车 Decorator装饰角色：抽象装饰接口，方便对真实对象添加功能
 * ConcreteDecorator具体装饰角色： 真正的装饰，给真正对象包装一层外衣。如Io流中的BufferedOutputStream、BufferedInputStream
 * @Version 1.0
 */
public class DecoratorDemo {

  public static void main(String[] args) {
    Car car = new Car();
    car.move();
    //手动地给car添加功能
    System.out.println("增加新的功能，飞行----------");
    Flycar flycar = new Flycar(car);
    flycar.move();
    System.out.println("既可以飞 又可以水下游--------");
//    SuperCar car1 = new Flycar(car);
    Swimcar swimcar = new Swimcar(flycar);
    swimcar.move();
    System.out.println("--------------");
    SuperCar car3 =  new Flycar(new Swimcar(new AIcar(new SuperCar(new Car()))));
    car3.move();

  }

}
